// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build darwin | | dragonfly | | freebsd | netbsd | | | openbsd 

package net

import (
	"runtime"
	"syscall"
)

func maxListenerBacklog() int {
	var (
		n   uint32
		err error
	)
	switch runtime.GOOS {
	case "darwin", "ios":
		n, err = syscall.SysctlUint32("kern.ipc.somaxconn")
	case "freebsd":
		n, err = syscall.SysctlUint32("kern.ipc.soacceptqueue")
	case "netbsd":
		// 注意：到目前为止，netbsd没有类似somaxconn的内核状态
	case "openbsd":
		n, err = syscall.SysctlUint32("kern.somaxconn")
	}
	if n == 0 || err != nil {
		return syscall.SOMAXCONN
	}
	// freebsd将积压存储在uint16中，就像Linux一样。
	// 假设其他BSD也这样做。截断数字以避免换行。
	// 见第5030期。
	if n > 1<<16-1 {
		n = 1<<16 - 1
	}
	return int(n)
}
